package org.example;

import java.util.*;

/**
 * 管理员类
 */

public class Administrator {

    /**
     * 管理员登录界面
     */
    void administratorMenu(){

        /**
         * 管理员密码输入
         */
        Painter.paintingSpace();
        System.out.print("请输入管理员密码（输入#退出登录）：");

        /**
         * 接收密码并处理异常情况
         */
        Check checker = new Check();
        String password;
        Scanner reader = new Scanner(System.in);
        password = reader.next();
        if(checker.isOut(password)){
            Supermarket.supermarketMainMenu();
        }

        /**
         * 登录成功
         */
        if(Objects.equals(password, "123456789")){

            Painter.paintingNSpace();
            System.out.println("----------管理员登录成功----------");
            Painter.paintingSpace();
            System.out.println("----------欢迎来到蓝旭大超市----------");
            Painter.paintingSpace();
            System.out.println("管理员操作：1.查看商品清单 2.添加商品 3.删除商品 4.修改商品信息 5.退出管理员登录");
            Painter.paintingSpace();
            System.out.print("请输入您想进行操作的编号：");

            /**
             * 进入管理员功能主界面
             */
            administratorFunction();
        }
        else{

            /**
             * 登录失败
             */
            Painter.paintingSpace();
            System.out.println("密码错误，请检查后重新输入");
            administratorMenu();
        }
    }

    /**
     * 管理员功能主界面
     */
    static void administratorFunctionMenu(){

        Painter.paintingNSpace();
        System.out.println("********************************************************");
        Painter.paintingSpace();
        System.out.println("请问您接下来需要做什么：");
        Painter.paintingSpace();
        System.out.println("1.查看商品清单 2.添加商品 3.删除商品 4.修改商品信息 5.管理员退出");
        Painter.paintingSpace();
        System.out.print("请输入您想进行的操作的编号：");

        /**
         * 管理员功能界面
         */
        administratorFunction();
    }

    /**
     * 管理员功能界面
     */
    static void administratorFunction(){

        /**
         * 接收操作数并处理非数字字符异常
         */
        Check checker = new Check();
        Scanner reader = new Scanner(System.in);
        String temp = reader.next();
        if(checker.isOut(temp)){
            administratorFunctionMenu();
        }
        while(checker.isNotIntegerNum(temp)){
            Painter.paintingNSpace();
            System.out.print("请您输入正确的操作数,输入#退出当前操作:");
            temp = reader.next();
            if(checker.isOut(temp)){
                administratorFunctionMenu();
            }
        }

        /**
         * 执行操作数对应的操作并处理操作数越界异常
         */
        while(Integer.parseInt(temp)!=5){
            switch (Integer.parseInt(temp)){
                case 1 -> {
                    Supermarket.displayInventory();
                    administratorFunctionMenu();
                }
                case 2 -> {
                    administratorFunctionTwo();
                    administratorFunctionMenu();
                }
                case 3 -> {
                    administratorFunctionThree();
                    administratorFunctionMenu();
                }
                case 4 -> {
                    administratorFunctionFour();
                    administratorFunctionMenu();
                }
                default -> {
                    Painter.paintingNSpace();
                    System.out.println("！！！请您输入正确的操作！！！");
                    administratorFunctionMenu();
                }
            }
        }

        /**
         * 管理员退出，返回超市主界面
         */
        SaveAndLoad.productDeleteSave();
        Painter.paintingSpace();
        System.out.println("管理员退出成功");
        Supermarket.supermarketMainMenu();

    }

    /**
     * 管理员操作二：添加商品
     */
    static void administratorFunctionTwo(){

        /**
         * 打印添加商品操作提示
         */
        Painter.paintingNSpace();
        System.out.println("----------添加商品操作----------");
        Painter.paintingSpace();
        System.out.print("请问您想添加几种商品:");

        /**
         * 接收输入数据并处理非数字字符异常
         */
        Scanner reader = new Scanner(System.in);
        Check checker = new Check();
        String temp = reader.next();
        while(checker.isNotIntegerNum(temp)||temp.length()>=10){
            Painter.paintingSpace();
            System.out.print("请输入正确的商品种数:");
            temp = reader.next();
        }
        int addNum = Integer.parseInt(temp);

        /**
         * 添加商品并处理各种异常
         */
        if(addNum<=0){
            Painter.paintingNSpace();
            System.out.println("你是管理员吧！认真对待自己的工作啊！");
            administratorFunctionMenu();
        }
        else {
            int now = 1;
            Painter.paintingNSpace();
            System.out.println("提示：在任意时刻输入#退出添加");
            while (addNum!= 0) {
                Product newProduct = new Product();

                /**
                 * 打印添加提示
                 */
                Painter.paintingSpace();
                System.out.println("ο(=•ω＜=)ρ⌒☆添加商品" + now + ":");
                Painter.paintingSpace();
                System.out.print("请输入商品编号:");

                /**
                 * 读取编号并处理#退出和商品重复异常
                 */
                temp = reader.next();
                if(checker.isOut(temp)){
                    administratorFunctionMenu();
                }
                while(checker.isExist(temp)){
                    if(checker.isOut(temp)){
                        administratorFunctionMenu();
                    }
                    Painter.paintingNSpace();
                    System.out.print("该编号与其他商品重复,请重新输入：");
                    temp = reader.next();
                }
                newProduct.id = temp;

                /**
                 * 读取商品名称并处理#退出
                 */
                Painter.paintingSpace();
                System.out.print("请输入商品名称:");
                temp = reader.next();
                if(checker.isOut(temp)){
                    administratorFunctionMenu();
                }
                newProduct.name = temp;

                /**
                 * 读取商品价格并处理非Double异常和#退出
                 */
                Painter.paintingSpace();
                System.out.print("请输入商品价格:");
                temp = reader.next();
                while(checker.isDoubleNum(temp)){
                    if(checker.isOut(temp)){
                        administratorFunctionMenu();
                    }
                    Painter.paintingNSpace();
                    System.out.print("你是管理员吧！认真对待自己的工作啊！请重新输入价格：");
                    temp = reader.next();
                }
                newProduct.price = Double.parseDouble(temp);

                /**
                 * 读取商品数量并处理非数字字符异常和#退出
                 */
                Painter.paintingSpace();
                System.out.print("请输入商品数量:");
                temp = reader.next();
                while(checker.isNotIntegerNum(temp)){
                    if(checker.isOut(temp)){
                        administratorFunctionMenu();
                    }
                    Painter.paintingNSpace();
                    System.out.print("你是管理员吧！认真对待自己的工作啊！请重新输入数量：");
                    temp = reader.next();
                }
                newProduct.quantity = Integer.parseInt(temp);

                /**
                 * 添加新商品
                 */
                Supermarket.addProduct(newProduct);
                SaveAndLoad.productDeleteSave();
                Painter.paintingSpace();
                System.out.println("！！添加成功！！");
                now++;
                addNum--;
            }
        }
    }

    /**
     * 管理员功能三：删除商品
     */
    static void administratorFunctionThree(){

        /**
         * 接收要删除商品的编号
         */
        Scanner reader = new Scanner(System.in);
        Painter.paintingNSpace();
        System.out.print("请输入您想删除商品的编号：");
        String deleteId = reader.next();

        /**
         * 如过存在则删除，不存在就提示异常
         */
        if(!Supermarket.inventory.removeIf(product -> product.id.equals(deleteId))){
            Painter.paintingNSpace();
            System.out.println("删除失败，请检查您输入的编号是否正确");
        }
        else{
            Supermarket.inventory.removeIf(product -> product.id.equals(deleteId));
            SaveAndLoad.productDeleteSave();
            Painter.paintingNSpace();
            System.out.println("！！！删除成功！！！");
        }
    }

    /**
     * 管理员功能四：修改商品信息
     */
    static void administratorFunctionFour(){

        /**
         * 接收商品编号，并判断是否存在，不存在处理异常
         */
        Scanner reader = new Scanner(System.in);
        Check checker = new Check();
        Painter.paintingSpace();
        System.out.print("请输入您想修改商品的编号：");
        String setProductId = reader.next();
        if(checker.isExist(setProductId)) {

            /**
             * 存在，询问修改商品的哪种信息并处理非数字字符异常
             */
            Painter.paintingSpace();
            System.out.println("请问您想修改商品的：");
            Painter.paintingSpace();
            System.out.println("1.价格 2.数量");
            Painter.paintingSpace();
            System.out.print("请输入想修改内容对应的编号：");
            String temp = reader.next();
            while(checker.isNotIntegerNum(temp)){
                Painter.paintingSpace();
                System.out.print("请输入正确的操作数：");
                temp = reader.next();
            }

            /**
             * 执行对应编号进行商品信息修改
             */
            switch (Integer.parseInt(temp)) {
                case 1 -> {
                    /**
                     * 修改价格并处理非Double异常
                     */
                    Painter.paintingSpace();
                    System.out.printf("您想将id为%s的商品的价格修改为：", setProductId);
                    temp = reader.next();
                    while(checker.isDoubleNum(temp)){
                        Painter.paintingNSpace();
                        System.out.print("请输入正确的价格:");
                        temp = reader.next();
                    }

                    /**
                     * 找到商品并修改价格
                     */
                    for (Product product : Supermarket.inventory) {
                        if (product.id.equals(setProductId)) {
                            Supermarket.inventory.get(Supermarket.inventory.indexOf(product)).setPrice(Double.parseDouble(temp));
                            SaveAndLoad.productDeleteSave();
                            break;
                        }
                    }

                }
                case 2 -> {
                    /**
                     * 修改数量并处理非数字字符异常
                     */
                    Painter.paintingSpace();
                    System.out.printf("您想将id为%s的商品的数量修改为：", setProductId);
                    temp = reader.next();
                    while(checker.isNotIntegerNum(temp)){
                        Painter.paintingSpace();
                        System.out.print("请输入正确的数量：");
                        temp = reader.next();
                    }

                    /**
                     * 找到商品并修改数量
                     */
                    for (Product product : Supermarket.inventory) {
                        if (product.id.equals(setProductId)) {
                            Supermarket.inventory.get(Supermarket.inventory.indexOf(product)).setQuantity(Integer.parseInt(temp));
                            SaveAndLoad.productDeleteSave();
                            break;
                        }
                    }

                }
                default -> {
                    Painter.paintingNSpace();
                    System.out.println("请您输入正确的操作");
                }
            }
        }
        else{
            Painter.paintingNSpace();
            System.out.println("请检查您输入的编号是否正确");
        }
    }
}
